package com.matrix.order.application;

import com.matrix.api.order.dto.AddDishDTO;
import com.matrix.api.order.dto.CancelDishDTO;
import com.matrix.api.order.dto.CreateOrderDTO;
import com.matrix.api.order.vo.*;
import com.matrix.common.domain.PageResult;
import com.matrix.common.enums.UserTypeEnum;
import com.matrix.order.domain.model.Order;

/**
 * @author 有点甜
 * @since 2025/8/2
 */
public interface OrderAppService {

    /**
     * 异步创建订单的入口方法
     */
    AsyncOrderResultVO createOrderAsync(Long userId, CreateOrderDTO orderDTO);

    /**
     * 执行订单创建的核心业务逻辑
     */
    Order processOrderCreation(Long userId, CreateOrderDTO orderDTO, String preAssignedOrderNo);

    /**
     * 商家获取订单列表
     */
    PageResult<OrderBriefVO> getOrderListForMerchant(Long userId, int pageNum, int pageSize, Integer status);

    /**
     * 商家接受订单
     */
    void acceptOrder(Long userId, Long orderId);

    /**
     * 商家拒绝订单
     */
    void rejectOrder(Long userId, Long orderId, String reason);

    /**
     * 商家完成菜品制作
     */
    void finishProduction(Long userId, Long orderId);

    /**
     * 商家开始上菜
     */
    void startServing(Long userId, Long orderId);

    /**
     * 商家完成上菜
     */
    void finishServing(Long userId, Long orderId);

    /**
     * 用户结束用餐
     */
    void finishMeal(Long userId, Long orderId);

    /**
     * 处理支付成功的回调
     */
    void handlePaymentSuccess(String paymentNo, Integer totalFee);

    /**
     * 用户加菜
     */
    AddDishResultVO addDish(Long userId, Long orderId, AddDishDTO addDishDTO);

    /**
     * 用户申请退菜
     */
    void requestCancelDish(Long userId, Long orderId, CancelDishDTO cancelDishDTO);

    /**
     * 用户呼叫服务员
     */
    void callWaiter(Long userId, Long orderId);

    /**
     * 商家同意退菜
     */
    void approveCancelDish(Long userId, Long orderItemId);

    /**
     * 商家拒绝退菜
     */
    void rejectCancelDish(Long userId, Long orderItemId);

    /**
     * 用户获取自己的订单列表
     */
    PageResult<OrderBriefVO> getUserOrders(Long userId, int pageNum, int pageSize, String statusGroup);

    /**
     * 检查并关闭单个支付超时的订单
     */
    void checkAndCloseTimeoutOrder(String orderNo);

    /**
     * 获取订单详情
     */
    OrderDetailVO getOrderDetail(Long orderId, Long userId, UserTypeEnum userType);
}